<?php

class AjaxAGHelper extends AppHelper {

    var $helpers = array('Html', 'Javascript', 'Form');
    var $Html = null;
    var $Javascript = null;
    var $callbacks = array(
        'complete', 'create', 'exception', 'failure', 'interactive', 'loading',
        'loaded', 'success', 'uninitialized', 'beforeSend', 'complete', 'error', 'dataFilter'
    );
    var $ajaxOptions = array(
        'after', 'asynchronous', 'before', 'confirm', 'condition', 'contentType', 'encoding',
        'evalScripts', 'failure', 'fallback', 'form', 'indicator', 'insertion', 'interactive',
        'loaded', 'loading', 'method', 'onCreate', 'onComplete', 'onException', 'onFailure',
        'onInteractive', 'onLoaded', 'onLoading', 'onSuccess', 'onUninitialized', 'parameters',
        'position', 'postBody', 'requestHeaders', 'success', 'type', 'update', 'with'
    );
    var $dragOptions = array(
        'handle', 'revert', 'snap', 'zindex', 'constraint', 'change', 'ghosting',
        'starteffect', 'reverteffect', 'endeffect', 'scroll', 'scrollSensitivity',
        'onStart', 'onDrag', 'onEnd'
    );
    var $dropOptions = array(
        'accept', 'containment', 'greedy', 'hoverclass', 'onHover', 'onDrop', 'overlap'
    );
    var $sortOptions = array(
        'constraint', 'containment', 'dropOnEmpty', 'ghosting', 'handle', 'hoverclass', 'onUpdate',
        'onChange', 'only', 'overlap', 'scroll', 'scrollSensitivity', 'scrollSpeed', 'tag', 'tree',
        'treeTag', 'update'
    );

    /**
     * Options for slider.
     *
     * @var array
     */
    var $sliderOptions = array(
        'alignX', 'alignY', 'axis', 'disabled', 'handleDisabled', 'handleImage', 'increment',
        'maximum', 'minimum', 'onChange', 'onSlide', 'range', 'sliderValue', 'values'
    );

    /**
     * Options for in-place editor.
     *
     * @var array
     */
    var $editorOptions = array(
        'okText', 'cancelText', 'savingText', 'formId', 'externalControl', 'rows', 'cols', 'size',
        'highlightcolor', 'highlightendcolor', 'savingClassName', 'formClassName', 'loadTextURL',
        'loadingText', 'callback', 'ajaxOptions', 'clickToEditText', 'collection', 'okControl',
        'cancelControl', 'submitOnBlur'
    );

    /**
     * Options for auto-complete editor.
     *
     * @var array
     */
    var $autoCompleteOptions = array(
        'afterUpdateElement', 'callback', 'frequency', 'indicator', 'minChars', 'onShow', 'onHide',
        'parameters', 'paramName', 'tokens', 'updateElement'
    );

    /**
     * Output buffer for Ajax update content
     *
     * @var array
     */
    var $__ajaxBuffer = array();

    /*
      Funcion ajaxSimple
      $metodo = El método de la petición HTTP. Por defecto es POST
      $parameters = Lista de valores que se envían junto con la petición. Deben estar formateados como una query string: parametro1=valor1&parametro2=valor2
      $codificacion = Indica la codificación de los datos enviados en la petición. Su valor por defecto es UTF-8
      $asincrono = Controla el tipo de petición que se realiza. Por defecto es true, lo que indica que la petición realizada al servidor es asíncrona, el tipo de petición habitual en las aplicaciones AJAX
      $eventos = arreglo de eventos que deseas configurar en tu ajax, donde el indice representa el evento y el valor es una cadena javascript a ser utilizada los posibles eventos son :
      onCreate => Objeto es Inicializado. Esto es despues de que los parametros y la URL  han sido procesados, pero antes que se abra la conexion al objeto ajax (XHR object).
      onUninitialized =>  (No requerido): Llamado justo despues de que el Objeto Ajax (XHR object) es creado.
      onLoading => (No Requerido): Disparado cuando el Objeto Ajax (XHR) ha sido configurado y la conexion ha sido abierta.
      onLoaded => (No Requerido): Disparado una vez que el Objeto Ajax (XHR) ha sido configurado y la conexion ha sido abierta, y el metod send ha sido llamado (Envio de solicitud real).
      onInteractive => (No Requerido): Disparado cada vez que el solicitante recibe una parte de la respuesta (pero no la parte final), en caso de ser enviado en varios paquetes.
      onSuccess  (Ejecuto Sastifactoriamente)=> Se invoca cuando una solicitud se completa y su código de estado no está definido y ocurre antes onComplete.
      onFailure (Ocurrio un error de ruta) => Se invoca cuando una solicitud se completa y existe el código de estado y ocurre antes onComplete....
      onException (Ocurrio un error de codigo) => Se activa cada vez que surja un error del Objeto Ajax (XHR). Tiene una firma personalizada: el primer argumento es el solicitante (es decir, una instancia Ajax.Request), y el segundo es el objeto de excepción.
      onComplete (Finaliza la peticion)=> dispara al final del ciclo de vida de una petición, una vez completada la solicitud, las devoluciones de llamada de estado específico son llamados, y los posibles comportamientos automáticos son procesados​​. Garantizado para funcionar independientemente de lo que ocurrió durante la petición.
      Ejemplo:
      $this->AjaxAG->ajaxSimple('div_actulizar','tu_controler/tu_accion',array('onSuccess'=>'codigo java script a ejecutar'))
      $this->AjaxAG->ajaxSimple('div_actulizar','tu_controler/tu_accion',array('onSuccess'=>'codigo java script a ejecutar','GET'))
     *
     *  */

    function ajaxSimple($div, $url, $eventos = array(), $etiqueta = 0, $eval = true, $asincrono = true, $codificacion = 'UTF-8') {
        $DJS="";
        $ajax = ($etiqueta == 1) ? "<script type='text/javascript'>" : "";
         foreach ($eventos as $indice => $valor) {
            $DJS.="$indice&_:_&$valor&_:_&";
        }
        $DJS.="";
        $ajax .= "AjaxDinamico('$div', '$url', '$DJS', '$eval', '$asincrono', '$codificacion');";
        $ajax .= ($etiqueta == 1) ? "</script>" : "";
        return $ajax;
    }
    
    function ajaxDatos($div, $url, $datos = array(), $eventos = array(), $etiqueta = 0, $metodo = 'POST', $eval = true, $asincrono = true, $codificacion = 'UTF-8') {
        $datos_final = (count($datos) > 0) ? implode(",", $datos) : '';
        $ajax = ($etiqueta == 1) ? "<script type='text/javascript'>" : "";
        $ajax .= "
            var datos = $datos_final;
            var datos_id = datos.split(',');
            var matriz= new Array(datos_id.length);
            var minx=new Array();
            var cadena , n, valor, i;
            for(i = 0; i < datos_id.length; i++)
            {
                matriz[i] =  vacio(document.getElementById(datos_id[i]).value);
                minx.push('_&_'+matriz[i]);
            }
            cadena=minx.toString();
            n=cadena.replace(',_&_','/');
            for(i = 0; i < datos_id.length; i++)
            {
                n=n.replace(',_&_','/');
            }
            n=n.replace('_&_','/');
            var url=$url;
            url=url+n;
            new Ajax.Updater($div,url, 
            {
                encoding:$codificacion,
                method:$metodo,
                asynchronous:$asincrono,
		evalScripts:$eval,";
        foreach ($eventos as $indice => $valor) {
            $ajax.="$indice:function(request){ $valor },";
        }
        $ajax.="requestHeaders:['X-Update', $div]
            });";
        $ajax .= ($etiqueta == 1) ? "</script>" : "";
    }

    /*
      Funcion ajaxFormulario
      $div = ID del elemento a ser actualizado
      $url = Direccion a ser llamada ('Controlador/accion')
      $formulario = id del formulario a ser enviado
      $metodo = El método de la petición HTTP. Por defecto es POST
      $codificacion = Indica la codificación de los datos enviados en la petición. Su valor por defecto es UTF-8
      $asincrono = Controla el tipo de petición que se realiza. Por defecto es true, lo que indica que la petición realizada al servidor es asíncrona, el tipo de petición habitual en las aplicaciones AJAX
      $eventos = arreglo de eventos que deseas configurar en tu ajax, donde el indice representa el evento y el valor es una cadena javascript a ser utilizada los posibles eventos son :
      onCreate => Objeto es Inicializado. Esto es despues de que los parametros y la URL  han sido procesados, pero antes que se abra la conexion al objeto ajax (XHR object).
      onUninitialized =>  (No requerido): Llamado justo despues de que el Objeto Ajax (XHR object) es creado.
      onLoading => (No Requerido): Disparado cuando el Objeto Ajax (XHR) ha sido configurado y la conexion ha sido abierta.
      onLoaded => (No Requerido): Disparado una vez que el Objeto Ajax (XHR) ha sido configurado y la conexion ha sido abierta, y el metod send ha sido llamado (Envio de solicitud real).
      onInteractive => (No Requerido): Disparado cada vez que el solicitante recibe una parte de la respuesta (pero no la parte final), en caso de ser enviado en varios paquetes.
      onSuccess  (Ejecuto Sastifactoriamente)=> Se invoca cuando una solicitud se completa y su código de estado no está definido y ocurre antes onComplete.
      onFailure (Ocurrio un error de ruta) => Se invoca cuando una solicitud se completa y existe el código de estado y ocurre antes onComplete....
      onException (Ocurrio un error de codigo) => Se activa cada vez que surja un error del Objeto Ajax (XHR). Tiene una firma personalizada: el primer argumento es el solicitante (es decir, una instancia Ajax.Request), y el segundo es el objeto de excepción.
      onComplete (Finaliza la peticion)=> dispara al final del ciclo de vida de una petición, una vez completada la solicitud, las devoluciones de llamada de estado específico son llamados, y los posibles comportamientos automáticos son procesados​​. Garantizado para funcionar independientemente de lo que ocurrió durante la petición.
      Ejemplo:
      $this->AjaxAG->ajaxSimple('div_actulizar','tu_controler/tu_accion','tu_formulario',array('onSuccess'=>'codigo java script a ejecutar'))
      $this->AjaxAG->ajaxSimple('div_actulizar','tu_controler/tu_accion','tu_formulario',array('onSuccess'=>'codigo java script a ejecutar','GET'))
     *
     *  */

    function ajaxFormulario($div, $url, $formulario, $eventos = array(), $etiqueta = 0, $metodo = 'POST', $eval = true, $asincrono = true, $codificacion = 'UTF-8') {
        $ajax = ($etiqueta == 1) ? "<script type='text/javascript'>" : "";
        $ajax .= "
            new Ajax.Updater($div,$url, 
            {
                parameters: Object.extend($($formulario).serialize()),
                encoding:$codificacion,
                method:$metodo,
                asynchronous:$asincrono,
		evalScripts:$eval,";
        foreach ($eventos as $indice => $valor) {
            $ajax.="$indice:function(request){ $valor },";
        }
        $ajax.="requestHeaders:['X-Update', $div]
            });";
        $ajax .= ($etiqueta == 1) ? "</script>" : "";
    }

}

?>
